#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.24'

pipeline {

  agent { label 'linux' }

  parameters {
    string(
      name: 'BRANCH_NAME',
      description: 'Name of the branch to checkout and build.',
      defaultValue: 'develop',
    )
    string(
      name: 'PR_ID',
      description: 'ID of the Pull Request triggering this build.',
    )
    string(
      name: 'APK_URL',
      description: 'Optional, set if job require APK to be downloaded from URL.',
    )
    string(
      name: 'KEYWORD_EXPRESSION',
      description: 'This will run tests which contain names that match the given string expression  (Optional)',
      defaultValue: '',
    )
    string(
      name: 'TR_CASE_IDS',
      description: 'IDs of the TestRail case, separated by a comma (Optional)',
      defaultValue: '',
    )
    /* FIXME: Remove this no longer relevant argument */
    string(
      name: 'APK_NAME',
      description: 'OBSOLETE ARGUMENT TO BE REMOVED',
      defaultValue: 'DUMMY',
    )
    string(
      name: 'TEST_MARKERS',
      description: 'Marker expression for matching tests to run.',
      defaultValue: 'smoke',
    )
  }

  options {
    disableConcurrentBuilds()
    timeout(time: 90, unit: 'MINUTES')
    buildDiscarder(logRotator(
      numToKeepStr: '10',
      daysToKeepStr: '30',
      artifactNumToKeepStr: '1',
    ))
  }

  environment {
    /* Avoid race conditions with other builds using virtualenv. */
    VIRTUAL_ENV = "${WORKSPACE_TMP}/venv"
    PATH = "${VIRTUAL_ENV}/bin:${PATH}"
  }

  stages {
    stage('Prep') {
      steps { script {
        currentBuild.displayName = "PR-${params.PR_ID}"
        if (params.PR_ID == null) {
          error("PR_ID parameter not set!")
        }
      } }
    }

    stage('Fetch') {
      when { expression { !params.APK_URL } }
      steps { script {
        copyArtifacts(
          projectName: "status-mobile/prs/android-e2e/PR-${params.PR_ID}",
          /* WARNING: This copies the latest available artifact. */
          selector: lastWithArtifacts(),
        )
        apk_path = "${env.WORKSPACE}/${utils.findFile('result/*.apk')}"
      } }
    }

    stage('Setup') {
      steps { script {
        dir('test/appium') {
          sh "python3 -m venv ${VIRTUAL_ENV}"
          sh 'pip3 install -r requirements.txt'
        }
      } }
    }

    stage('Test') {
      steps { script {
        /* for managing optional arguments */
        def extraPytestOpts = ''
        if (params.TR_CASE_IDS != '') {
          extraPytestOpts = "--run_testrail_ids='${params.TR_CASE_IDS}'"
        } else {
          extraPytestOpts = "-m \"${params.TEST_MARKERS}\""
        }

        withCredentials([
          usernamePassword(
            credentialsId: 'status-im-auto',
            usernameVariable: 'GIT_HUB_USER', /* ignored */
            passwordVariable: 'GIT_HUB_TOKEN'
          ),
          usernamePassword(
            credentialsId:  'test-rail-api',
            usernameVariable: 'TESTRAIL_USER',
            passwordVariable: 'TESTRAIL_PASS'
          ),
          usernamePassword(
            credentialsId:  'lambda-test-api',
            usernameVariable: 'LAMBDA_TEST_USERNAME',
            passwordVariable: 'LAMBDA_TEST_ACCESS_KEY'
          ),
          string(
            credentialsId: 'etherscan-api-key',
            variable: 'ETHERSCAN_API_KEY'
          ),
          string(
            credentialsId: 'infura-e2e-token',
            variable: 'WEB3_INFURA_PROJECT_ID'
          ),
          file(
            credentialsId: "mobile-tests-eth-accounts",
            variable: 'TEST_ETH_ACCOUNTS_FILE'
          ),
        ]) {
          dir('test/appium/tests') {
            /* Provide Eth test account secrets. */
            sh 'cp -f $TEST_ETH_ACCOUNTS_FILE users.py'
            sh """
              python3 -m pytest \
                --numprocesses 9 \
                --testrail_report=True \
                -k \"${params.KEYWORD_EXPRESSION}\" \
                --apk=${params.APK_URL ?: apk_path} \
                --build=PR-${params.PR_ID}-${utils.timestamp()} \
                --pr_number=${params.PR_ID} \
                ${extraPytestOpts}
            """
          }
        }
      } }
    }
  }
  post {
    cleanup {
      sh 'make purge'
    }
  }
}
